<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="/pages/layout/masterLayout.xhtml">
	<ui:define name="tituloPagina">Introdução a Managed Beanas</ui:define>
	<ui:define name="conteudo">
		<h1>Introdução a Managed Beans</h1>
		<p>Os Managed Beans são objetos java gerenciados pelo framework
			JSF. Junto com a EL (Expression Language) é possível fazer a
			comunicação de uma página JSF com o código Java.</p>
		<p>Mas qual o significado de "gerenciado pelo framework JSF"? Isto
			significa que você configura alguns parâmetros e o JSF vai criar
			(instanciar) um bean sempre que for necessário, ou vai utilizar uma
			instância já existente que não está sendo utilizada por outra
			requisição web!</p>
		<p>
			Uma das principais características que você pode configurar no bean é
			seu <b>escopo</b>. Os escopos válidos são:
		</p>
		<ul>
			<li>request</li>
			<li>session</li>
			<li>application</li>
		</ul>
		<p>
			No caso de <b>request</b>, o JSF vai disponibilizar uma instância
			para processar o comando (ex: uma navegação em um link ou um clique
			em um botão). Depois que a página é mostrada (ou a view é
			renderizada, no jargão JSF), os dados serão descartados. Se um form
			efetuar um postback e algum componente de input estiver relacionado
			com um bean de request, estes dados poderão ser acessados com
			segurança em dois momentos - 1) no método que processa o submit. 2)
			na próxima página, após a navegação, durante a renderização.
		</p>
		<p>
			Quando se tratar de um escopo de sessão (<b>session</b>), o JSF vai
			criar uma única instância para cada sessão http e armazenar os dados
			das variáveis entre as chamadas. Desta forma é possível criar, por
			exemplo, uma classe para manter os dados de login do usuário atual.
			Deve-se tomar cuidado com este tipo de escopo, pois armazenar
			variáveis "pesadas" pode sobrecarregar o servidor.
		</p>
		<p>
			O escopo <b>application</b> informa ao JSF para criar apenas um bean
			que será compartilhado entre todas as sessões http. É útil para,
			justamente, compartilhar dados comuns a todos os usuários.
			Normalmente é utilizado como cache para minimizar chamadas ao banco
			de dados (ex: busca e armazena todos os estados do Brasil).
		</p>
		<h2>Criando e registrando um bean</h2>
		<p>Criar e registrar? Porquê tenho que fazer as duas coisas? Qual
			a diferença?</p>
		<p>Bom, criar significa gerar o código-fonte java da classe que
			representa o bean em questão. Já registrar significa informar ao
			framework JSF, em um arquivo de configuração XML, que você quer que
			ele interprete sua nova classe como um managed bean!</p>
		<p>Para uma classe ser um "bean" você não precisa programar nada
			além de um POJO (Plain Old Java Object - um objeto java sem nenhuma
			frescura adicional)</p>
		<p>A única coisa que você deve lembrar é que, quando for feita a
			integração com a Expression Language (linguagem que permite acessar
			os beans via páginas JSF) você só conseguirá acessar os métodos get
			(para mostrar algo na tela) e set (para associar um campo de input
			com uma variável).</p>
		<p>Exemplo do código Java:</p>
		<pre class="prettyprint lang-java">package br.com.kane.exemplo.webbean;

public class IntroducaoELBean {

	public String getUmTextoQualquer() {
		return "Meu texto qualquer!!";
	}

	public Integer getUmNumeroQualquer() {
		return 123456;
	}
}</pre>
		<p>
			Este exemplo cria um Bean com dois métodos que retornam dados quando
			chamados. Agora, basta registrar esta classe no arquivo <b>faces-config.xml</b>
			para que o framework JSF entenda que se trata de um Managed Bean.
		</p>
		<pre class="prettyprint lang-xml">&lt;managed-bean&gt;
	&lt;managed-bean-name&gt;introducaoELBean&lt;/managed-bean-name&gt;
	&lt;managed-bean-class&gt;br.com.kane.exemplo.webbean.IntroducaoELBean&lt;/managed-bean-class&gt;
	&lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
&lt;/managed-bean&gt;</pre>
		<p>É só isto! Basta declarar o escopo, o nome da classe e um nome
			"amigável", o qual será utilizado para acessar o bean pelas páginas
			JSF!</p>
	</ui:define>
</ui:composition>
</html>